/*
    通讯录服务端控制器的定义: 
        被当作回调函数用于Router路由器模块，处理请求并给予响应。处于业务层和应用层之间，进行逻辑的主要控制。
*/
#pragma once
#include "../common/httplib.h"
#include "../common/add_contacts.pb.h"
#include "../common/contacts_expection.hpp"
#include "contacts_server.hpp"

// 联系人控制器
class ContactsController
{
public:
    // 添加联系人
    static void AddContacts(const httplib::Request& req, httplib::Response& rsp)
    {
        try
        {
            // 1. 反序列化
            add_contacts::AddContactsRequest request;
            if(!request.ParseFromString(req.body))
                throw ContactsException("AddContactsRequest反序列化失败");

            // 2. 添加联系人
            add_contacts::AddContactsResponse response;
            ContactsServer::AddContacts(request, response);

            // 3. 序列化
            std::string response_str;
            if(!response.SerializeToString(&response_str))
                throw ContactsException("AddContactsResponse序列化失败");

            // 5. 设置http响应
            rsp.status = 200;
            rsp.set_header("Content-Type", "application/protobuf");
            rsp.body = response_str;
        }
        catch(const ContactsException& e)
        {
            // 构建响应
            add_contacts::AddContactsResponse response;
            base_response::BaseResponse* base_response_ptr = response.mutable_base_response();
            base_response_ptr->set_success(false);
            base_response_ptr->set_error_desc(e.what());
            
            // 序列化
            std::string response_str;
            if(response.SerializeToString(&response_str))
            {
                // 设置http响应
                rsp.status = 500;
                rsp.set_header("Content-Type", "application/protobuf");
                rsp.body = response_str;
            }
        }
    }

    // 删除联系人
    static void DeleteContacts(const httplib::Request& req, httplib::Response& rsp)
    {

    }

    // 查看联系人
    static void QueryContacts(const httplib::Request& req, httplib::Response& rsp)
    {

    }

    // 删除联系人
    static void QueryContactsList(const httplib::Request& req, httplib::Response& rsp)
    {

    }
};